4.1.2 容器
到目前为止,读者已经拥有一个拉取到本地的镜像,可以使用 docker container run
命令从镜像来启动容器。
在Linux中启动容器的命令如下。
$ docker container run -it ubuntu:latest /bin/bash
root@6dc20d508db0:/#
在Windows中启动容器的命令如下。
> docker container run -it microsoft/powershell:nanoserver pwsh.exe
Windows PowerShell
Copyright (C) 2016 Microsoft Corporation. All rights reserved.
PS C:\>
仔细观察上面命令的输出内容,会注意到每个实例中的提示符都发生了变化。这是因为 -it
参数会将Shell切换到容器终端——现在已经位于容器内部了!
接下来分析一下 docker container run
命令。 docker container run
告诉Docker daemon启动新的容器。其中 -it
参数告诉Docker开启容器的交互模式并将读者当前的Shell连接到容器终端(在容器章节中会详细介绍)。接下来,命令告诉Docker,用户想基于 ubuntu:latest
镜像启动容器(如果用户使用Windows,则是基于 microsoft/powershell:nanoserver
镜像)。最后,命令告诉Docker,用户想要在容器内部运行哪个进程。对于Linux示例来说是运行Bash Shell,对于Windows示例来说则是运行PowerShell。
在容器内部运行 ps
命令查看当前正在运行的全部进程。
Linux示例如下。
root@6dc20d508db0:/# ps -elf
F S UID PID PPID NI ADDR SZ WCHAN STIME TTY TIME CMD
4 S root 1 0 0 - 4560 wait 13:38 ? 00:00:00 /bin/bash
0 R root 9 1 0 - 8606 - 13:38 ? 00:00:00 ps -elf
Windows示例如下。
PS C:\> ps
Handles NPM(K) PM(K) WS(K) CPU(s) Id SI ProcessName
------- ------ ----- ----- ------ -- -- -----------
0 5 964 1292 0.00 4716 4 CExecSvc
0 5 592 956 0.00 4524 4 csrss
0 0 0 4 0 0 Idle
0 18 3984 8624 0.13 700 4 lsass
0 52 26624 19400 1.64 2100 4 powershell
0 38 28324 49616 1.69 4464 4 powershell
0 8 1488 3032 0.06 2488 4 services
0 2 288 504 0.00 4508 0 smss
0 8 1600 3004 0.03 908 4 svchost
0 12 1492 3504 0.06 4572 4 svchost
0 15 20284 23428 5.64 4628 4 svchost
0 15 3704 7536 0.09 4688 4 svchost
0 28 5708 6588 0.45 4712 4 svchost
0 10 2028 4736 0.03 4840 4 svchost
0 11 5364 4824 0.08 4928 4 svchost
0 0 128 136 37.02 4 0 System
0 7 920 1832 0.02 3752 4 wininit
0 8 5472 11124 0.77 5568 4 WmiPrvSE
Linux容器中仅包含两个进程。
- PID 1:代表
/bin/bash
进程,该进程是通过docker container run
命令来通知容器运行的。 - PID 9:代表
ps -elf
进程,查看当前运行中进程所使用的命令/程序。
命令输出中展示的 ps -elf
进程存在一定的误导,因为这个程序在 ps
命令退出后就结束了。这意味着容器内长期运行的进程其实只有 /bin/bash
。
Windows 容器运行中的进程会更多,这是由 Windows 操作系统工作方式决定的。虽然Windows容器中的进程比Linux容器要多,但与常见的Windows服务器相比,其进程数量却是明显偏少的。
按 Ctrl-PQ组合键
,可以在退出容器的同时还保持容器运行。这样Shell就会返回到Docker主机终端。可以通过查看Shell提示符来确认。
现在读者已经返回到Docker主机的Shell提示符,再次运行 ps
命令。
Linux示例如下。
$ ps -elf
F S UID PID PPID NI ADDR SZ WCHAN TIME CMD
4 S root 1 0 0 - 9407 - 00:00:03 /sbin/init
1 S root 2 0 0 - 0 - 00:00:00 [kthreadd]
1 S root 3 2 0 - 0 - 00:00:00 [ksoftirqd/0]
1 S root 5 2 -20 0 - 00:00:00 [kworker/0:0H]
1 S root 7 2 -0 - 0 - 00:00:00 [rcu_sched]
<Snip>
0 R ubuntu 22783 22475 0 - 9021 - 00:00:00 ps -elf
Windows示例如下。
> ps
Handles NPM(K) PM(K) WS(K) CPU(s) Id SI ProcessName
------- ------ ----- ----- ------ -- -- -----------
220 11 7396 7872 0.33 1732 0 amazon-ssm-agen
84 5 908 2096 0.00 2428 3 CExecSvc
87 5 936 1336 0.00 4716 4 CExecSvc
203 13 3600 13132 2.53 3192 2 conhost
210 13 3768 22948 0.08 5260 2 conhost
257 11 1808 992 0.64 524 0 csrss
116 8 1348 580 0.08 592 1 csrss
85 5 532 1136 0.23 2440 3 csrss
242 11 1848 952 0.42 2708 2 csrss
95 5 592 980 0.00 4524 4 csrss
137 9 7784 6776 0.05 5080 2 docker
401 17 22744 14016 28.59 1748 0 dockerd
307 18 13344 1628 0.17 936 1 dwm
<SNIP>
1888 0 128 136 37.17 4 0 System
272 15 3372 2452 0.23 3340 2 TabTip
72 7 1184 8 0.00 3400 2 TabTip32
244 16 2676 3148 0.06 1880 2 taskhostw
142 7 6172 6680 0.78 4952 3 WmiPrvSE
148 8 5620 11028 0.77 5568 4 WmiPrvSE
可以看到与容器相比,Docker主机中运行的进程数要多很多。Windows容器中运行的进程要远少于Windows主机,Linux容器中的进程数也远少于Linux主机。
在之前的步骤当中,是使用 Ctrl-PQ组合键
来退出容器的。在容器内部使用该操作可以退出当前容器,但不会杀死容器进程。读者可以通过 docker container ls
命令查看系统内全部处于运行状态的容器。
$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS NAMES
e2b69eeb55cb ubuntu:latest "/bin/bash" 7 mins Up 7 min vigilant_borg
上述的输出显示只有一个运行中的容器。这就是前面示例中创建的那个容器。输出中有该容器,证明了容器在退出后依然是运行的。读者可以看到这个进程是7min之前创建的,并且一直在运行。